package part1.api.map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;

/**
 * Map的遍历
 * Map提供了三种遍历方式:
 * 遍历所有的key
 * 遍历每一组键值对
 * 遍历所有的value(这个操作不常用)
 */
public class MapDemo2 {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("语文", 99);
        map.put("数学", 98);
        map.put("英语", 97);
        map.put("物理", 96);
        map.put("化学", 99);
        System.out.println(map);

        /*
            遍历所有的key
            Set<K> keySet()
            将当前Map中所有的key以一个Set集合形式返回，遍历这个集合就等于遍历了所有的key
         */
        Set<String> keySet = map.keySet();
        for (String key : keySet){
            System.out.println("key:"+key);
        }
        //keySet.forEach(e-> System.out.println(e));
        //keySet.forEach(System.out::println);


        /*
          Map.Entry它的每一个实例用于表示Map中的一组键值对
          Entry有两个常用的方法:
          getKey(),getValue()分别用于获取其表示的键值对中的key和value

         */
        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
        for (Map.Entry<String,Integer> e: entrySet){
            String key = e.getKey();
            Integer value = e.getValue();
            System.out.println(key+":"+value);
        }


        /*
            遍历所有的value
            Collection<V> values()
            将当前Map中所有的value值以集合形式返回，遍历集合等于遍历所有的value
         */
        Collection<Integer> values = map.values();
        for (Integer value : values){
            System.out.println("value:"+value);
        }




        /*
            在JDK1.8之后集合和Map提供了一种新的遍历方式:基于lambda表达式遍历
            该方法为: forEach()

            集合中，forEach方法会将集合每个元素都拿到并吊哦用Consumer的accept方法陆续传入
            注:Consumer消费者
         */
//        keySet.forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });
        keySet.forEach(s -> System.out.println(s));
        /*
            在lambad表达式最后那个，若果参数与调用方法中传入的参数一致时，可以简写为方法引用:
            e->对象.方法(e);
            可以写为:
            对象::方法
         */
        keySet.forEach(System.out::println);

        /*
           Map也提供了forEach
         */
        map.forEach(new BiConsumer<String, Integer>() {
            @Override
            public void accept(String k, Integer v) {
                System.out.println(k+":"+v);
            }
        });
        map.forEach((k,v)-> System.out.println(k+":"+v));

    }
}
